package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.Date;
import java.util.List;


import modeloDatos.Presupuesto;


public class DAOPresupuestos {
	
	private Connection conn;
	
	public DAOPresupuestos() {
    }	
	public void finalize(){
		ConnectionManager.getInstance().checkIn(conn);
    }
	public boolean editarNombre(int idPresupuesto, String nombre){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "UPDATE presupuesto SET nombre=? WHERE idPresupuesto=?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			stmt.setInt(2, idPresupuesto);
			stmt.execute();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
	}
	
	public boolean eliminarPresupuesto(int idPresupuesto){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "DELETE FROM presupuesto WHERE idPresupuesto=?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idPresupuesto);
			stmt.executeUpdate();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
	}

	public List<Presupuesto> seleccionaPresupuestosGenericos(){
		//devuelve una lista con todos los presupuestos genericos
		List<Presupuesto> listaP = new ArrayList<Presupuesto>();
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE idClienteEmpresa IS NULL";
		
		try{
			stmt = conn.prepareStatement(sql);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()){
				int idPres = rs.getInt("idPresupuesto");
				String nombre = rs.getString("nombre");
				java.sql.Date fecha = rs.getDate("fecha");
				if(!nombre.equals("")){
					Presupuesto presupuesto = new Presupuesto(idPres,0,fecha);
					presupuesto.setNombre(nombre);
	
				
					listaP.add(presupuesto);
				}
			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		return listaP;
	}
	
	public Presupuesto getPresupuesto(int idPresupuesto){
		Presupuesto presupuesto = null;
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE idPresupuesto=?";
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idPresupuesto);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()){
				int idCliente = rs.getInt("idClienteEmpresa");
				String nombre = rs.getString("nombre");
				Date fecha = rs.getDate("fecha");
				Boolean estado = rs.getBoolean("estado");
				presupuesto = new Presupuesto(idPresupuesto, idCliente,fecha);
				presupuesto.setNombre(nombre);
				presupuesto.setFecha(fecha);
				presupuesto.setEstado(estado);

			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		
		return presupuesto;
		
	}
	
	public Presupuesto getPresupuesto(String nombre){
		Presupuesto presupuesto = null;
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE nombre=?";
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()){
				int idCliente = rs.getInt("idClienteEmpresa");
				int idPresupuesto = rs.getInt("idPresupuesto");
				Date fecha = rs.getDate("fecha");
				Boolean estado = rs.getBoolean("estado");
				presupuesto = new Presupuesto(idPresupuesto, idCliente,fecha);
				presupuesto.setNombre(nombre);
				presupuesto.setFecha(fecha);
				presupuesto.setEstado(estado);

			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		
		return presupuesto;
		
	}
	
	public Presupuesto getPresupuestoNuloGenerico(){
		Presupuesto presupuesto = null;
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE nombre = '' AND idClienteEmpresa IS NULL";
		try{
			stmt = conn.prepareStatement(sql);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()){
				int idPresupuesto = rs.getInt("idPresupuesto");
				Date fecha = rs.getDate("fecha");
				Boolean estado = rs.getBoolean("estado");
				presupuesto = new Presupuesto(idPresupuesto,0,fecha);
				presupuesto.setNombre("");
				presupuesto.setFecha(fecha);
				presupuesto.setEstado(estado);

			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		
		return presupuesto;
		
	}
	
	public Presupuesto getPresupuestoNulo(int idCliente){
		Presupuesto presupuesto = null;
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE nombre = '' AND idClienteEmpresa = ?";
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idCliente);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()){
				int idPresupuesto = rs.getInt("idPresupuesto");
				Date fecha = rs.getDate("fecha");
				Boolean estado = rs.getBoolean("estado");
				presupuesto = new Presupuesto(idPresupuesto, idCliente,fecha);
				presupuesto.setNombre("");
				presupuesto.setFecha(fecha);
				presupuesto.setEstado(estado);

			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		
		return presupuesto;
		
	}
	
	public List<Presupuesto> getPresupuestosAsociados(int idClienteEmpresa){
		//devuelve una lista con todos los presupuestos asociados a un cliente/empresa
		List<Presupuesto> listaP = new ArrayList<Presupuesto>();
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM presupuesto WHERE idClienteEmpresa=?";
		
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idClienteEmpresa);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()){
				int idPres = rs.getInt("idPresupuesto");
				String nombre = rs.getString("nombre");
				Date fecha = rs.getDate("fecha");
				Boolean estado = rs.getBoolean("estado");
				Presupuesto presupuesto = new Presupuesto(idPres, idClienteEmpresa,fecha);
				presupuesto.setNombre(nombre);
				presupuesto.setFecha(fecha);
				presupuesto.setEstado(estado);
				listaP.add(presupuesto);
			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		return listaP;
	}

	public int insertarPresupuesto(Integer idclienteEmpresa, String nombre){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;

		String sql = "INSERT INTO presupuesto(idPresupuesto, idClienteEmpresa,nombre,fecha, estado) VALUES (NULL,?,?,?,FALSE)";
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1,idclienteEmpresa);
			stmt.setString(2, nombre);
			stmt.setDate(3, new Date(System.currentTimeMillis()));
			
			stmt.execute();
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
            return 1;
		}finally {
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
		
		return 0;
	}

	
	public int insertarPresupuestoGenerico(String nombre){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;

		String sql = "INSERT INTO presupuesto(idPresupuesto, nombre,fecha, estado) VALUES (NULL,?,?,FALSE)";
		try{
			stmt = conn.prepareStatement(sql);
			
			stmt.setString(1, nombre);
			stmt.setDate(2, new Date(System.currentTimeMillis()));
			stmt.execute();
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
            return 1;
		}finally {
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
		return 0;
	}
	public boolean aceptarPresupuesto(Integer idPresupuesto, Date fecha) {
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "UPDATE presupuesto SET estado=true, fecha=? WHERE idPresupuesto=?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setDate(1, fecha);
			stmt.setInt(2,idPresupuesto);
			stmt.execute();
			
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
			return false;
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
	}
}
